package demo;
//演示 单例模式
//懒汉式单例模式
public class LazyMan {

    private LazyMan(){
        System.out.println(Thread.currentThread().getName()+"ok");
    }


    private volatile static  LazyMan lazyMan;
    // private static  LazyMan lazyMan;  加 volatile 避免指令重排

    //双重检测锁模式的 懒汉式单例  DCL 懒汉式
    public  static LazyMan getInstance() {
        if (lazyMan==null){
            synchronized (LazyMan.class){
                if (lazyMan==null){
                    lazyMan=new LazyMan(); //不是原子性操作
                    /**
                     * 1.分配内存空间
                     * 2.执行构造方法，初始化对象
                     * 3.把这个对象执行这个空间
                     * 123
                     * 132 A
                     *     B 线程B可能因为线程A已经指向空间了，
                     *       然后判断lazyMan不为空导致直接返回lazyMan但此事lazyMan还未进行执行构造（2）
                     *       有可能是因为指令重排导致的现象  因此11行 加 volatile 避免指令重排
                     *       //此时lazyMan还没有完成构造
                     */
                }
            }
        }
        return lazyMan;
    }

    public static void main(String[] args) {
        for (int i = 0; i < 10; i++) {
            new Thread(()->{
                LazyMan.getInstance();
            }).start();
        }
    }

    //单线程下ok
}
